package user;

import book.Library;
import utils.PremissionExeception;
import constant.Constant;

import java.util.Scanner;

public class ProxyUser {
    private User realUser;

    Library library = Library.getLibrary();

     public ProxyUser(User realUser) {
        this.realUser = realUser;
    }

    //获取该代理类所代理的真实对象
    public User getRealUser() {
        return realUser;
    }

    public void display() {
        realUser.display();
    }

    //--------------------------------------------管理员相关方法--------------------------------------------//

    /**
     * 管理员权限检查方法
     * @param exceptionMessage
     */
    private void checkRealUserWhetherAdminUser(String exceptionMessage) {
         if(!(realUser instanceof AdminUser)) {
             throw new PremissionExeception(exceptionMessage);
         }
    }

    //添加书籍操作
    public void addBook() {
        //检查用户是不是管理员
        System.out.println("Proxy: 检查用户权限");
        checkRealUserWhetherAdminUser("普通用户没有权限上架图书");
        ((AdminUser) realUser).addBook();
    }

    //更新书籍操作
    public void updataBook() {
        //检查用户是不是管理员
        System.out.println("Proxy: 检查用户权限");
        checkRealUserWhetherAdminUser("普通用户没有权限更新图书");
        ((AdminUser)realUser).updateBook();
    }

    //移除图书
    public void removeBook() {
        //检查用户是不是管理员
        System.out.println("Proxy: 检查用户权限");
        checkRealUserWhetherAdminUser("普通用户没有权限下架图书");
        ((AdminUser)realUser).removeBook();
    }

    //查看图书的借阅次数
    public void borrowedCount() {
        //检查用户是不是管理员
        System.out.println("Proxy: 检查用户权限");
        checkRealUserWhetherAdminUser("普通用户没有权限查看图书借阅次数");
        ((AdminUser)realUser).borrowCount();
    }

    //查看最受欢迎的前K本书
    public void generateBook() {
        //检查用户是不是管理员
        System.out.println("Proxy: 检查用户权限");
        checkRealUserWhetherAdminUser("普通用户没有权限查看图书最受欢迎的图书");
        ((AdminUser)realUser).generateBook();
    }

    //查看库存状态
    public void checkInventoryStatus() {
        //检查用户是不是管理员
        System.out.println("Proxy: 检查用户权限");
        checkRealUserWhetherAdminUser("普通用户没有权限查看库存状态");
        ((AdminUser)realUser).checkInventoryStatus();
    }

    //移除上架超过1年的书籍
    public void checkAndRemoveOldBooks() {
        //检查用户是不是管理员
        System.out.println("Proxy: 检查用户权限");
        checkRealUserWhetherAdminUser("普通用户没有权限移除图书");
        ((AdminUser)realUser).checkAndRemoveOldBooks();
    }

    //------------------------------------------------普通用户相关方法------------------------------------------------//

    /**
     * 普通用户权限检查方法
     * @param exceptionMessage
     */
    private void checkRealUserWhetherNormal(String exceptionMessage) {
        if(!(realUser instanceof NormalUser)) {
            throw new PremissionExeception(exceptionMessage);
        }
    }

    //借阅图书
    public void borrowBook() {
        checkRealUserWhetherNormal("管理员请以普通用户的身份借阅图书");
        ((NormalUser)realUser).borrowBook();
    }

    //归还图书
    public void returnBook() {
        checkRealUserWhetherNormal("管理员请以普通用户的身份归还图书");
        ((NormalUser)realUser).returnBook();
    }

    //查看个人借阅情况
    public void viewBorrowHistory() {
        checkRealUserWhetherNormal("管理员请以普通用户的身份查阅个人借阅情况");
        ((NormalUser)realUser).viewBorrowHistory();
    }

    //用户交互菜单
    public void handleOperation(int choice) {
        if(realUser instanceof AdminUser) {
            //管理员操作
            switch (choice) {
                case Constant.SEARCH_BOOK:
                    library.searchBook();
                    break;
                case Constant.DISPLAY_BOOK:
                    library.displayBooks();
                    break;
                case Constant.EXIT:
                    library.exit();
                    break;
                case Constant.ADD_BOOK:
                    addBook();
                    break;
                case Constant.UPDATE_BOOK:
                    updataBook();
                    break;
                case Constant.REMOVE_BOOK:
                    removeBook();
                    break;
                case Constant.BORROWED_BOOK_COUNT:
                    borrowedCount();
                    break;
                case Constant.GENERATE_BOOK:
                    generateBook();
                    break;
                case Constant.CHECK_INVENTORY_STATUS:
                    checkInventoryStatus();
                    break;
                case Constant.CHECK_AND_REMOVE_OLD_BOOK:
                    checkAndRemoveOldBooks();
                    break;
                default:
                    System.out.println("无效的操作!");
            }
        } else if(realUser instanceof NormalUser) {
            //普通用户操作
            switch (choice) {
                case Constant.SEARCH_BOOK:
                    library.searchBook();
                    break;
                case Constant.DISPLAY_BOOK:
                    library.displayBooks();
                    break;
                case Constant.EXIT:
                    library.exit();
                    break;
                case Constant.BORROWED_BOOK:
                    borrowBook();
                    break;
                case Constant.RETURN_BOOK:
                    returnBook();
                    break;
                case Constant.VIEW_BORROW_HISTORY_BOOK:
                    viewBorrowHistory();
                    break;
                default:
                    System.out.println("无效的操作!");

            }
        }

    }

}
